﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

/// <summary>
/// 包含扩展方法的类。
/// </summary>
public static class Extension
{
	#region bool IsMobile(this string value, ...) 指示该字符串是否符合手机号格式（1开头的11位数字）

	/// <summary>
	/// 指示该字符串是否符合手机号格式（1开头的11位数字）
	/// </summary>
	/// <param name="value"></param>
	/// <param name="pattern">要匹配的正则表达式模式</param>
	/// <param name="options">枚举值的一个按位组合，这些枚举值提供匹配选项</param>
	/// <returns></returns>
	public static bool IsMobile(this string value, string pattern = @"^1[1-9]\d{9}$", RegexOptions options = RegexOptions.None)
	{
		bool result = false;

		if (Regex.IsMatch(value, pattern, options))
			result = true;

		return result;
	}

	#endregion

	#region int ConvertInt(...) 将字符串转换为Int类型。

	/// <summary>
	/// 将字符串转换为Int类型。
	/// <para>转换失败或异常时返回 defaultValue。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="defaultValue">默认值</param>
	/// <returns></returns>
	public static int ConvertInt(this string value, int defaultValue = 0)
	{
		int result = 0;

		if (!int.TryParse(value, out result))
			result = defaultValue;

		return result;
	}

	/// <summary>
	/// 将字符串转换为Int类型。
	/// </summary>
	/// <param name="value"></param>
	/// <returns></returns>
	/// <exception cref="ArgumentException"></exception>
	/// <exception cref="ArgumentNullException"></exception>
	public static int ConvertInt(this string value)
	{
		if (string.IsNullOrWhiteSpace(value))
			throw new ArgumentException("参数“value”不能为空引用或空字符串。");

		int result = 0;

		if (!int.TryParse(value, out result))
			throw new ArgumentException("参数“value”转换为 Int32 失败。", "value");

		return result;
	}

	#endregion

	#region decimal ConvertDecimal(...) 将字符串转换为Decimal类型。

	/// <summary>
	/// 将字符串转换为Decimal类型。
	/// <para>转换失败或异常时返回 defaultValue。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="defaultValue">默认值</param>
	/// <returns></returns>
	public static decimal ConvertDecimal(this string value, decimal defaultValue = 0)
	{
		decimal result = 0;

		if (!decimal.TryParse(value, out result))
			result = defaultValue;

		return result;
	}

	/// <summary>
	/// 将字符串转换为Decimal类型。
	/// </summary>
	/// <param name="value"></param>
	/// <returns></returns>
	/// <exception cref="ArgumentException"></exception>
	/// <exception cref="ArgumentNullException"></exception>
	public static decimal ConvertDecimal(this string value)
	{
		if (string.IsNullOrWhiteSpace(value))
			throw new ArgumentException("参数“value”不能为空引用或空字符串。");

		decimal result = 0;

		if (!decimal.TryParse(value, out result))
			throw new ArgumentException("参数“value”转换为 Decimal 失败。", "value");

		return result;
	}

	#endregion

	#region List<string> ConvertListString(this string value, char separator = '|', bool clearEmpty = false) 将字符串转换为泛型

	/// <summary>
	/// 将字符串转换为泛型。
	/// <para>字符串格式为：“字符1|字符2|...”，分割线与separator参数匹配。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="separator">分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null</param>
	/// <param name="clearEmpty">是否清除空字符串</param>
	/// <returns></returns>
	public static List<string> ConvertListString(this string value, char separator = '|', bool clearEmpty = false)
	{
		List<string> infos = new List<string>();

		if (!string.IsNullOrWhiteSpace(value))
		{
			foreach (string val in value.Split(separator))
			{
				if (clearEmpty && !string.IsNullOrWhiteSpace(val))
					infos.Add(val);

				else if (!clearEmpty)
					infos.Add(val);
			}
		}

		return infos;
	}

	#endregion

	#region void DoubleBufferedListView(this System.Windows.Forms.ListView lv, bool flag) 双缓冲，解决闪烁问题。

	/// <summary>
	/// 双缓冲，解决闪烁问题。
	/// </summary>
	/// <param name="lv"></param>
	/// <param name="flag">为True时启用双缓冲</param>
	public static void DoubleBufferedListView(this System.Windows.Forms.ListView lv, bool flag)
	{
		Type lvType = lv.GetType();
		System.Reflection.PropertyInfo pi = lvType.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
		pi.SetValue(lv, flag, null);
	}

	#endregion
}
